package proyectoX.src.fabricas;

import java.util.Random;

import proyectoX.src.aplicacion.Juego;
import proyectoX.src.powerups.Power_up;

/**
 * Clase que diagrama cómo se desarrolla el primer nivel del juego.
 * 
 * Los primeros 3 flags (flag15, flag35 y flag60) hacen referencia a la cantidad de 
 * naves enemigas que se deben destruir para que se activen (dejan powerups).
 * 
 * Los otros flags corresponden a milisegundos transcurridos y serán activados
 * cuando haya pasado esa cantidad de tiempo.
 * 
 * El flagJefe corresponde al momento en el cual será creado el jefe final del nivel
 * y la condición de activación es que haya pasado un minuto y medio y que se haya eliminado
 * al menos a 50 naves enemigas. 
 *
 */
public class FactoryPrimerNivel extends FactoryNivel {

	protected FactoryNavesEnemigas fabricaEnemigas;

	//flags para creación de powerups
	protected boolean flag15;
	protected boolean flag35;
	protected boolean flag60;
	
	//flags para creación de enemigos
	protected boolean flag15000;
	protected boolean flag30000;
	protected boolean flag45000;
	protected boolean flag60000;
	protected boolean flag80000;
	protected boolean flagJefe;

	protected long ultimoTransporte;
	protected long ultimoKamikaze;
	protected long ultimaBasica;
	protected long tiempoInicial;
	
	protected int numeroKamikaze;	//para crear una cada 40 segundos

	//cantidad máxima de naves de tipo X creadas a la vez
	protected static final int MAX_CANT_BASICAS_SIMUL = 4;
	protected static final int MAX_CANT_TRANSPORTE_SIMUL = 2;

	protected Random generador;

	


	/**
	 * Se inicializan todos los flags en falso y los tiempos de última creación de nave
	 * en 0 y se guarda el tiempo inicial de creación.
	 * @param j Objeto Juego.
	 */
	public FactoryPrimerNivel(Juego j) {
		super(j);

		fabricaEnemigas = new FactoryNavesEnemigas(j);

		flag15 = false;
		flag35 = false;
		flag60 = false;
		
		flag15000 = false;
		flag30000 = false;
		flag45000 = false;
		flag60000 = false;
		flag80000 = false;
		flagJefe = false;

		numeroKamikaze = 1;
		
		ultimoKamikaze = 0;  //inicializado así para que no se cree un kamikaze en tiempo 0
		ultimoTransporte = 0;
		ultimaBasica = 0;
		tiempoInicial = System.currentTimeMillis();

		generador = new Random();
	}


	@Override
	/**
	 * Se van creando enemigos a medida que pasa el tiempo pero una vez creado el jefe,
	 * sólo se crean naves de tranporte a los costados cada tantos segundos.
	 */
	public void crearEnemigos() {
		long tiempoActual = System.currentTimeMillis() - tiempoInicial;
		
		//Una vez creado el jefe no se crean enemigos aleatoriamente
		if (!flagJefe) {
			
			
			//CREACIÓN DE POWERUPS QUE SÓLO DEPENDEN DE LA CANTIDAD TOTAL DE NAVES ENEMIGAS ELIMINADAS
			if ((juego.getBajas() >= 15)&&(!flag15)) {
				Power_up p = juego.getNivelActual().getFabricaPowerups().crearNivelLaser(generador.nextInt(400), -50);
				juego.getNivelActual().agregarPowerup(p);
				flag15 = true;
			}
 
			if ((juego.getBajas() >= 35)&&(!flag35)) {
				Power_up p = juego.getNivelActual().getFabricaPowerups().crearMunicionesHabilidad(generador.nextInt(400), -50); 
				juego.getNivelActual().agregarPowerup(p);
				flag35 = true;
			}

			if ((juego.getBajas() >= 60)&&(!flag60)) {
				Power_up p = juego.getNivelActual().getFabricaPowerups().crearNivelLaser(generador.nextInt(400), -50);
				juego.getNivelActual().agregarPowerup(p);
				flag60 = true;
			}


			//Revisar si es momento de los flags
			if ((!flag15000) && (tiempoActual >= 15000)) {
				fabricaEnemigas.crearFilaIzquierdaBasica();
				flag15000 = true;
			}

			if ((!flag30000) && (tiempoActual >= 30000)) {
				fabricaEnemigas.crearFilaDerechaBasica();
				flag30000 = true;
			}

			if ((!flag45000) && (tiempoActual >= 45000)) {
				fabricaEnemigas.crearTrianguloNorteTransporte();
				flag45000 = true;
			}
			
			if ((!flag60000) && (tiempoActual >= 60000)) {
				fabricaEnemigas.crearFilaIzquierdaBasica();
				fabricaEnemigas.crearFilaDerechaBasica();
				fabricaEnemigas.crearTrianguloNorteTransporte();
				flag60000 = true;
			}
			
			if ((!flag80000) && (tiempoActual >= 80000)) {
				fabricaEnemigas.crearFilaIzquierdaBasica();
				fabricaEnemigas.crearFilaDerechaBasica();
				flag80000 = true;
			}
			
			//si ha pasado un minuto y medio Y se han matado al menos 50 naves enemigas... es tiempo del jefe final!!
			if (((!flagJefe) && (tiempoActual >= 90000))&&(juego.getBajas() >= 50)) {
//			if ((!flagJefe) && (tiempoActual >= 10000)) {  //este es de prueba
				fabricaEnemigas.crearJefe();
				flagJefe = true;
				juego.activarJefe();
			}
			
			
			//Creacion de una kamikaze cada 40 segundos
			if (tiempoActual - ultimoKamikaze >= 40000*numeroKamikaze) {
				fabricaEnemigas.crearKamikaze();
				ultimoKamikaze = tiempoActual;
				numeroKamikaze++;
			}


			//Creacion aleatoria
			int aux = generador.nextInt(5);

			if ((aux == 1)&&((tiempoActual - ultimaBasica) >= 3000)) {
				int lim = generador.nextInt(MAX_CANT_BASICAS_SIMUL)+1;	//sumo 1 para que no se creen 0

				for (int i = 0; i < lim; i++) {
					fabricaEnemigas.crearBasica();
				}
				ultimaBasica = tiempoActual;
			}

			if ((aux == 2)&&((tiempoActual - ultimoTransporte) >= 6000)) {
				int lim = generador.nextInt(MAX_CANT_TRANSPORTE_SIMUL)+1; //sumo 1 para que no se creen 0

				for (int i = 0; i < lim; i++) {
					fabricaEnemigas.crearTransporte();
				}
				ultimoTransporte = tiempoActual;
			}
		}
		else {
			//durante la pelea con el jefe cae verticalmente una nave que otorga powerups cada 8 segundos
			if ((tiempoActual - ultimoTransporte) >= 8000) {
				int pos = generador.nextInt(2);
				if (pos == 0) {
					fabricaEnemigas.crearTransporte(30, -100, 0);
					ultimoTransporte = tiempoActual;
				}
				else {
					fabricaEnemigas.crearTransporte(440, -100, 0);
					ultimoTransporte = tiempoActual;
				}
			}
		}
	}
}
